來做個簡單的登入系統吧
一樣回歸最基本的功能,http form submit 然後使用Post redirect get的方式導頁
然後明天來檢查user到底有沒有在的處理,今天是PRG跟如何debug,參考day 12
再login.clj就只有一個login_handler
我先將程式簡化
(defn login_handler [req]
;; For demo how to debug ~~~
(def req req)
(prn (:params req))
(m/match
req
{:request-method :post :params {:_action "login"}}
(rr/redirect (-> (:reitit.core/router req)
(r/match-by-name :hello.you)
r/match->path))
:else
{:status 200
:headers {"Content-Type" "text/html;charset=UTF-8"}
:body "..."
}))
handler下面直接多定義一個一樣的req
然後!!!!!
我們就可以在repl中開發看看要怎麼跳、要去哪裡,要怎麼取值(值真的有送的話)
程式邊寫,寫完evaluate,最終就跟我們怎麼進來的流程一樣,途中要驗證都不用切換瀏覽器、輸資料、送出
回到上面的程式
這邊也帶出另一個很常用的macro ->
前面有提到,這個就是pipe,幫你把前面的值當下一個的第一個帶下去,所以還原就會變成
(-> (:reitit.core/router req)
(r/match-by-name :hello.you)
r/match->path)
(r/match->path (r/match-by-name (:reitit.core/router req) :hello.you))
好讀多了吧XDD
另外只有一個參數時,那個function的括弧是可選的
(-> (:reitit.core/router req)
(r/match-by-name :hello.you)
r/match->path)
(-> (:reitit.core/router req)
(r/match-by-name :hello.you)
(r/match->path))